package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.DTO.property.PropertyProjectRemoveRoomInfoDTO;
import com.itlong.cloud.POJO.PO.MomentRelievePO;
import com.itlong.cloud.POJO.PO.PropertyRoomQrcodeBatchRecordPO;
import com.itlong.cloud.POJO.PO.RoomInfoPO;
import com.itlong.cloud.POJO.VO.miniprogram.MiniProgramPassRoomListVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectRoomInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectRoomSimpleInfoExVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectRoomSimpleInfoVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      房间信息数据访问接口
 * </desc>
 * @createDate 2017-09-29.
 */
@Mapper
@Repository
public interface IPropertyRoomInfoDao extends IAbstractBaseDao<RoomInfoPO> {

    /**
     * <desc>
     *      保存单个房间信息
     * </desc>
     *
     * @param params 保存的参数
     * @return 受影响的行数
     * @author LewisLouis
     * @createDate 2017-09-29
     */
    Integer save(Map<String,Object> params);

    /**
     * <desc>
     *      批量保存房屋信息（导入Excel时会使用）
     * </desc>
     *
     * @param params 待保存的房屋信息列表
     * @return 受影响的行数
     * @author LouisLewis
     * @createDate 2017-10-16
     */
    Integer batchSave(List<Map<String, Object>> params);

    /**
     * <desc>
     *      修改房屋信息【根据房屋Id（RoomId）】
     * </desc>
     *
     * @param params 保存的参数
     * @return 受影响的行数
     * @author LewisLouis
     * @createDate 2017-09-30
     */
    Integer update(Map<String,Object> params);

    /**
     * <desc>
     *      批量更新房屋信息（导入Excel时会使用）
     * </desc>
     *
     * @param params 待更新的房屋信息列表
     * @return 受影响的行数
     * @author LouisLewis
     * @createDate 2017-10-16
     */
    Integer batchUpdate(List<Map<String, Object>> params);

    /**
     * <desc>
     *      根据条件删除房屋信息.
     * </desc>
     *
     * @param  propertyProjectRemoveRoomInfoDTO 删除房屋信息数据传输对象
     * @return 受影响的行数
     * @author LewisLouis
     @createDate 2017-09-30
     */
    Integer remove(PropertyProjectRemoveRoomInfoDTO propertyProjectRemoveRoomInfoDTO);

    /**
     * <desc>
     *      分页查询房屋信息
     * </desc>
     *
     * @param params 查询参数
     * @return  分页数据集
     * @author LewisLouis
     * @createDate 2017-09-30
     */
    List<PropertyProjectRoomInfoVO> getPageList(Map<String,Object> params);

    /**
     * <desc>
     *      分页查询指定单元下的房屋简单信息（房屋id ,房屋名称）列表
     * </desc>
     *
     * @param params 查询参数
     * @return 房屋简单信息（房屋id ,房屋名称）列表
     * @author LewisLouis
     * @createDate 2017-10-09
     */
    List<PropertyProjectRoomSimpleInfoVO> getPageRoomSimpleInfoList(Map<String,Object> params);

    /**
     * <desc>
     *      精确查询，获取单个房间信息
     * </desc>
     * @param roomInfoPO 查询房间信息数据传输对象
     * @return 按创建时间降序排列，首个符合查询条件的房间信息
     * @author LouisLewis
     * @createDate 2017-10-16
     */
    PropertyProjectRoomInfoVO getOneRoomInfo(RoomInfoPO roomInfoPO);

    /**
     * <desc>
     *      精确查询，快速获取单个房间简单信息
     * </desc>
     * @param roomInfoPO 查询房间信息数据传输对象
     * @return 不进行排序，返回首个符合查询条件的房间信息
     * @author LouisLewis
     * @createDate 2018-02-06
     */
    RoomInfoPO getOneSimpleRoomInfo(RoomInfoPO roomInfoPO);

    /**
     * <desc>
     *      按楼栋Id列表查询房间信息(用于导出)
     * </desc>
     * @param buildIds 楼栋Id列表
     * @param projectId 项目Id
     * @return 房屋信息列表
     * @author LouisLewis
     * @createDate 2017-10-16
     */
    List<PropertyProjectRoomInfoVO> getRoomInfoByBuildIds(@Param("projectId")String projectId,@Param("buildIds")String[] buildIds);

    /**
     * <desc>
     *      按单元Id列表查询房间信息(用于查找最小可用房号和访客呼叫码)
     * </desc>
     * @param unitId 单元Id
     * @return 房屋信息列表
     * @author LouisLewis
     * @createDate 2018-01-16
     */
    List<PropertyProjectRoomSimpleInfoExVO> getRoomInfoByUnitId(@Param("unitId")String unitId);

    /**
     * <desc>
     *      获取房间信息记录总数
     * </desc>
     *
     * @param params 查询参数
     * @return 记录总行数
     * @author LewisLouis
     * @createDate 2017-10-09
     */
    Integer getRecordCount(Map<String,Object> params);


    /**
     * <desc>
     *     查询项目下所有房屋信息
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @author wangzhi
     * @createDate 2018-04-26
     */
    List<RoomInfoPO> getAllRoomInfoByProject(@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询所有房屋
     * </desc>
     *
     * @param projectId 项目编号
     * @return 项目下所有房屋
     * @author wangzhi
     * @createDate 2019/01/07
     */
    List<PropertyProjectRoomInfoVO> getAllRoomInfoByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *    根据用户编号获取用户
     * </desc>
     *
     * @param userId  用户编号
     * @param projectId 项目编号
     * @return 用户的房间信息
     * @author Qiang.S
     * @createDate 2018-11-20
     */
    List<MiniProgramPassRoomListVO> myRoomsInfo(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *    根据用户编号获取用户
     * </desc>
     *
     * @param userId  用户编号
     * @param projectId 项目编号
     * @return 用户的房间信息
     * @author Qiang.S
     * @createDate 2018-11-20
     */
    List<MiniProgramPassRoomListVO> myRoomsInfoOther(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *    根据手机号查询用户UserId
     * </desc>
     *
     * @param phoneNum  手机号
     * @return 用户的userId
     * @author Juguang.S
     * @createDate 2019-04-25
     */
    String getUserIdByPhone(@Param("phoneNum") String phoneNum);

    /**
     * <desc>
     *      查询空置房屋数量
     * </desc>
     *
     * @param params 查询参数
     * @return 空置房屋数量
     * @author wangzhi
     * @createDate 2019/05/24
     */
    Integer getResideRoomCount(Map<String, Object> params);

    /**
     * <desc>
     *      查询过期的临时解除限制信息
     * </desc>
     *
     * @return 过期的临时解除限制信息
     * @author wangzhi
     * @createDate 2019/05/31
     */
    List<MomentRelievePO> getOverdueMomentRelieve();

    /**
     * <desc>
     *      通过房间id判断用户项目下欠费房间个数
     * </desc>
     *
     * @param roomId 房间id
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/05/31
     */
    Integer getArrearRoomCount(@Param("roomId") String roomId, @Param("userId") String userId);

    /**
     * <desc>
     *      更新用户项目欠费状态
     * </desc>
     *
     * @param roomId 房间id
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/05/31
     */
    Integer updateUserProjectArrearageStatus(@Param("roomId") String roomId, @Param("arrearageStatus") Integer arrearageStatus, @Param("userId") String userId);

    /**
     * <desc>
     *      通过房间id,正背门信息查询是否修改了正背门
     * </desc>
     *
     * @param roomId 房间id
     * @param liftDoorType 正背门信息
     * @return 受影响行数
     * @author Qiang.S
     * @createDate 2019/06/17
     */
    Integer checkLiftDoorType(@Param("roomId") String roomId,@Param("liftDoorType") Integer liftDoorType);

    /**
     * <desc>
     *      通过房间id查询房间下的有人脸的用户
     * </desc>
     *
     * @param roomId 房间id
     * @return 受影响行数
     * @author Jugaung.S
     * @createDate 2021/03/12
     */
    List<String> getFaceInfoByRoomId(@Param("roomId") String roomId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取该项目是否启用了人脸识别
     * <desc/>
     * @param   projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019/03/20
     */
    Integer isStartFaceByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      通过单元查询电梯设备
     * </desc>
     *
     * @param unitId 单元id
     * @return 受影响行数
     * @author Qiang.S
     * @createDate 2019/06/17
     */
    String getDeviceUniqueByUnit(@Param("unitId") String unitId);

    /**
     * <desc>
     *      删除临时解除限制
     * </desc>
     *
     * @param momentRoomList 房间id List
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/06/24
     */
    Integer deleteMomentRelieve(List<String> momentRoomList);

    /**
     * <desc>
     *      通过房间id查询房间下的住户
     * </desc>
     *
     * @param roomId 房间id
     * @return 用户id
     * @author wangzhi
     * @createDate 2019/06/28
     */
    List<String> getUserIdsByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      通过房间id查询房间二维码剩余次数
     * </desc>
     *
     * @param roomId 房间id
     * @return 用户id
     * @author wangzhi
     * @createDate 2019/10/10
     */
    PropertyRoomQrcodeBatchRecordPO getRoomQrCodeBatch(@Param("roomId") String roomId);

    /**
     * <desc>
     *      通过项目编号查询该项目类型
     * </desc>
     *
     * @param projectId 项目编号
     * @return 项目类型 1住宅 2办公
     * @author Juguang.S
     * @createDate 2020/04/14
     */
    String getProjectTypeByProjectId(@Param("projectId") String projectId);
}
